package Day021_反射_注解.demo5_反射之操作成员方法;

import java.lang.reflect.Method;

/**
 * @Author：pengzhilin
 * @Date: 2020/5/14 11:03
 */
public class Test1 {
    public static void main(String[] args) throws Exception {
        /*
            反射之操作成员方法:
                - 通过反射获取类的成员方法,并通过反射技术执行成员方法
                    - Method类概述
                            每一个成员方法都是一个Method类的对象。

                    - 通过反射获取类的成员方法
                            Class类中与Method相关的方法
                                * Method getMethod(String name,Class...args); 获取单个public修饰的成员方法
                                    * 根据方法名和参数类型获得对应的构造方法对象，只能获得public的

                                * Method getDeclaredMethod(String name,Class...args); 获取任意修饰符修饰的单个成员方法
                                    * 根据方法名和参数类型获得对应的构造方法对象，包括public、protected、(默认)、private的

                                * Method[] getMethods();  获取所有public修饰的成员方法
                                    * 获得类中的所有成员方法对象，返回数组，只能获得public修饰的且包含父类的

                                * Method[] getDeclaredMethods(); 获取所有成员方法
                                    * 获得类中的所有成员方法对象，返回数组,只获得本类的，包括public、protected、(默认)、private的

                        记忆:
                            Method getDeclaredMethod(String name,Class...args); 获取任意修饰符修饰的单个成员方法\
                            Method[] getDeclaredMethods(); 获取所有成员方法

                    - 通过反射执行成员方法
         */
        // 1.获取Student类的Class对象
        Class<?> c = Class.forName("com.itheima.demo5_反射之操作成员方法.Student");

        // 2.获取单个成员方法
        // 2.1 获取单个public修饰的方法
        // Method getMethod(String name,Class...args);
        // 第一个参数: 方法名
        // 第二个参数: 该方法的参数类型的Class对象,如果没有参数就不传入
        Method show1M1 = c.getMethod("show1");// 第一个show1方法
        System.out.println(show1M1);

        Method show1M2 = c.getMethod("show1", String.class, int.class);
        System.out.println(show1M2);

        // 2.2 获取单个private修饰的成员方法
        // Method getDeclaredMethod(String name,Class...args);
        // 第一个参数: 方法名
        // 第二个参数: 该方法的参数类型的Class对象,如果没有参数就不传入
        Method show3M = c.getDeclaredMethod("show3");
        System.out.println(show3M);

        System.out.println("=======================");

        // 3.获取多个public修饰的成员方法
        // 3.1 获取所有public修饰的成员方法
        // Method[] getMethods();
        Method[] mArr1 = c.getMethods();
        for (Method method : mArr1) {
            System.out.println(method);
        }

        System.out.println("=======================");

        // 3.2 获取所有的成员方法
        // Method[] getDeclaredMethods();
        Method[] mArr2 = c.getDeclaredMethods();
        for (Method method : mArr2) {
            System.out.println(method);
        }

    }
}
